route.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /* eslint-disable @typescript-eslint/no-explicit-any */
  2. import { NextRequest, NextResponse } from 'next/server';
  3. import { prisma } from '@/lib/prisma';
  4. export async function GET(
  5. request: NextRequest,
  6. { params }: { params: Promise<{ id: string }> }
  7. ) {
  8. try {
  9. const { id } = await params;
  10. const importId = parseInt(id);
  11. if (isNaN(importId)) {
  12. return NextResponse.json(
  13. { error: 'Invalid import ID' },
  14. { status: 400 }
  15. );
  16. }
  17. // Check if import exists
  18. const importRecord = await prisma.import.findUnique({
  19. where: { id: importId }
  20. });
  21. if (!importRecord) {
  22. return NextResponse.json(
  23. { error: 'Import not found' },
  24. { status: 404 }
  25. );
  26. }
  27. // Get basic summary data
  28. const totalRecords = await prisma.cintasInstallCalendar.count({
  29. where: { importId }
  30. });
  31. const cintasSummaries = await prisma.cintasSummary.findMany({
  32. where: { importId },
  33. orderBy: { week: 'asc' }
  34. });
  35. // Get file info
  36. const file = importRecord.fileId ? await prisma.file.findUnique({
  37. where: { id: importRecord.fileId }
  38. }) : null;
  39. const summary = {
  40. totalRecords,
  41. totalWeeks: cintasSummaries.length,
  42. cintasSummaries: cintasSummaries.map((summary: any) => ({
  43. week: summary.week,
  44. trrTotal: summary.trrTotal,
  45. fourWkAverages: summary.fourWkAverages,
  46. trrPlus4Wk: summary.trrPlus4Wk,
  47. powerAdds: summary.powerAdds
  48. }))
  49. };
  50. return NextResponse.json({
  51. importId,
  52. fileName: file?.filename || 'Unknown',
  53. uploadDate: importRecord.createdAt,
  54. summary,
  55. summaryExists: cintasSummaries.length > 0
  56. });
  57. } catch (error) {
  58. console.error('Error fetching import summary:', error);
  59. return NextResponse.json(
  60. { error: 'Failed to fetch import summary' },
  61. { status: 500 }
  62. );
  63. }
  64. }
  65. export async function POST(
  66. request: NextRequest,
  67. { params }: { params: Promise<{ id: string }> }
  68. ) {
  69. try {
  70. const { id } = await params;
  71. const importId = parseInt(id);
  72. if (isNaN(importId)) {
  73. return NextResponse.json(
  74. { error: 'Invalid import ID' },
  75. { status: 400 }
  76. );
  77. }
  78. // Check if import exists
  79. const importRecord = await prisma.import.findUnique({
  80. where: { id: importId }
  81. });
  82. if (!importRecord) {
  83. return NextResponse.json(
  84. { error: 'Import not found' },
  85. { status: 404 }
  86. );
  87. }
  88. // Check if summary already exists
  89. const existingSummaries = await prisma.cintasSummary.count({
  90. where: { importId }
  91. });
  92. if (existingSummaries > 0) {
  93. // Return existing summary
  94. const cintasSummaries = await prisma.cintasSummary.findMany({
  95. where: { importId },
  96. orderBy: { weekId: 'desc' }
  97. });
  98. return NextResponse.json({
  99. importId,
  100. summaryGenerated: false,
  101. message: 'Summary already exists',
  102. summary: cintasSummaries.map((summary: any) => ({
  103. week: summary.week,
  104. trrTotal: summary.trrTotal,
  105. fourWkAverages: summary.fourWkAverages,
  106. trrPlus4Wk: summary.trrPlus4Wk,
  107. powerAdds: summary.powerAdds
  108. }))
  109. });
  110. }
  111. // Execute the stored procedure to generate summary
  112. await prisma.$executeRawUnsafe(
  113. `CALL cintas_calculate_summary(${importId})`
  114. );
  115. // Fetch the newly generated summary
  116. const cintasSummaries = await prisma.cintasSummary.findMany({
  117. where: { importId },
  118. orderBy: { weekId: 'desc' }
  119. });
  120. return NextResponse.json({
  121. importId,
  122. summaryGenerated: true,
  123. message: 'Summary generated successfully',
  124. summary: cintasSummaries.map((summary: any) => ({
  125. week: summary.week,
  126. trrTotal: summary.trrTotal,
  127. fourWkAverages: summary.fourWkAverages,
  128. trrPlus4Wk: summary.trrPlus4Wk,
  129. powerAdds: summary.powerAdds
  130. }))
  131. });
  132. } catch (error) {
  133. console.error('Error generating summary:', error);
  134. return NextResponse.json(
  135. { error: 'Failed to generate summary', details: error instanceof Error ? error.message : 'Unknown error' },
  136. { status: 500 }
  137. );
  138. }
  139. }